package com.lsp.lock.two;

import com.lsp.lock.one.SleepUtils;

import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.concurrent.TimeUnit;

/**
 * @Author: liusupeng
 * @Date: 2021/6/20 11:36
 */
public class WaitNotify {

    static boolean flag = true;
    static Object lock = new Object();


    public static void main(String[] args) throws Exception {

        Thread waitThread = new Thread(new Wait(), "WaitThread");
        waitThread.start();
        TimeUnit.SECONDS.sleep(1);
        Thread notifyThread = new Thread(new Notify(), "NotifyThread");
        notifyThread.start();
    }


    static class Wait implements Runnable {

        @Override
        public void run() {
            //加锁，拥有lock的Monitor
            synchronized (lock) {
                System.out.println(Thread.currentThread() + "flag is true . wait @  " + new SimpleDateFormat("HH:mm:ss").format(new Date()));
                try {
                    System.out.println("我进来了，线程开始等待------");
                    lock.wait();
                    System.out.println("------线程等待结束-------");
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
            //条件满足时，完成工作
            System.out.println(Thread.currentThread() + " flag is false. running @ " + new SimpleDateFormat("HH:mm:ss").format(new Date()));

        }
    }


    static class Notify implements Runnable {

        @Override
        public void run() {
            //加锁，拥有lock的Monitor
            //直到当前线程释放了lock，WwaitThread才能从wait方法中返回
            synchronized (lock) {
                System.out.println(Thread.currentThread() + "hold lock notify @" + new SimpleDateFormat("HH:mm:ss").format(new Date()));

                lock.notifyAll();
                flag = false;
                SleepUtils.second(5);
            }
            synchronized (lock) {
                //条件满足时，完成工作
                System.out.println(Thread.currentThread() + " hold lock again . sleep @ " + new SimpleDateFormat("HH:mm:ss").format(new Date()));
                SleepUtils.second(5);
            }

        }
    }


}
